package com.example.demo.mq.comsumer;
 
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.RedeliveryPolicy;

import javax.jms.*;
 
public class JmsConsumer_Redelivery {
    public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
    public static final String QUEUE_NAME = "Redelivery";
 
    public static void main(String[] args) throws JMSException {
        // 创建连接工厂，按照给定的url地址采用默认的用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);

        // 手动修改RedeliveryPolicy（重发策略）  默认是次
        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
        redeliveryPolicy.setMaximumRedeliveries(3);// 修改重发次数为3次
        activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);// 将重发策略设置到ConnectionFactory中


        // 通过连接工厂，获取Connection并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        // 创建Session
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        // 创建目的地（目的地有两个子接口，分别是Queue和Topic）
        Queue queue = session.createQueue(QUEUE_NAME);
        // 创建消费者，指明从queue取消息
        MessageConsumer messageConsumer = session.createConsumer(queue);
        while (true) {
            // 因为向队列中存放的是TextMessage的实例，所以取出来的时候，也要用TextMessage的实例来接收
            // 这里的receive()方法表示一直等待，如果给它传一个long类型的毫秒数，表示consumer等待超时时间
            TextMessage textMessage = (TextMessage) messageConsumer.receive(1000L);
            if (textMessage != null) {
                System.out.println("消费者消费："+textMessage.getText());
            } else {
                break;
            }
        }
        // 上面开启了事务，正常情况下，必须执行commit();这里模拟出问题的情况，注释掉commit();
        // session.commit();
        // 按照资源打开的相反顺序关闭资源
        messageConsumer.close();
        session.close();
        connection.close();
    }
}